#include <iostream>
using std::cout;
using std::endl;
//内部类可以定义在外部类的public区域、private区域、protected区域
//如果没有把内部类定义在public,就无法再外部类的外部直接创建内部类对象
//一般把内部类定义在private区域，增加一层隐藏

class Outside{
public:
    //可以认为内部类就是定义在外部类里面的友元类
    class Inside{
    public:
        void print(Outside & rhs){
            //内部类可以直接访问外部类的静态成员
            cout << _y << endl;
            //无法直接访问外部类的非静态成员
            //因为此时this指针指向的是内部类本对象
            cout << rhs._x << endl;
            //内部类可以通过外部类对象来访问外部类的非静态成员
            //哪怕是私有也可以
            cout << rhs._z << endl;
        }

        int _a;
    private:
        static int _b;
        int _c;
    };

    void display(Inside & rhs){
        //外部类不能直接访问内部类的数据成员
        //如果要访问需要通过内部类的对象
        cout << rhs._a << endl;
        //外部类访问内部类公有的静态成员需要加上作用域限定
        //外部类不能访问内部类私有的数据成员
        /* cout << Inside::_b << endl; */
        /* cout << rhs._c << endl; */
    }

    int _x;
    static int _y;
private:
    int _z;
};
int Outside::Inside::_b = 100;
int Outside::_y = 10;


void test0(){
    Outside out;
    Outside::Inside ins;
}

int main(void){
    test0();
    return 0;
}
